home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 003 / sox_2 / sox / c / sbdsp < prev    next >
Text File  |  1993-09-23  |  4KB  |  177 lines

  1.  
  2. char ansi_c_is_very_stupid_and_needs_a_variable_here;
  3.  
  4. #if    defined(BLASTER) || defined(SBLAST) || defined(LINUXSOUND)
  5. /*
  6.  * Copyright 1992 Rick Richardson
  7.  * Copyright 1991 Lance Norskog And Sundry Contributors
  8.  * This source code is freely redistributable and may be used for
  9.  * any purpose.  This copyright notice must be maintained. 
  10.  * Rick Richardson, Lance Norskog And Sundry Contributors are not
  11.  * responsible for the consequences of using this software.
  12.  */
  13.  
  14. /*
  15.  * Direct to Sound Blaster device driver.
  16.  * SBLAST patches by John T. Kohl.
  17.  */
  18.  
  19. #include <sys/types.h>
  20. #ifdef SBLAST
  21. #include <i386/isa/sblast.h>
  22. #else
  23. #ifdef LINUXSOUND
  24. #include <linux/soundcard.h>
  25. #else
  26. #include <sys/sb.h>
  27. #endif
  28. #endif
  29. #include <signal.h>
  30. #include "st.h"
  31.  
  32. /* Private data for SKEL file */
  33. typedef struct sbdspstuff {
  34.     int    samples;        /* bytes remaining in current block */
  35. } *sbdsp_t;
  36.  
  37. IMPORT float volume, amplitude;
  38. IMPORT int summary, verbose;
  39.  
  40. static got_int = 0;
  41.  
  42. static void
  43. sigint(s)
  44. {
  45.     if (s) got_int = 1;
  46.     else signal(SIGINT, sigint);
  47. }
  48.  
  49. /*
  50.  * Do anything required before you start reading samples.
  51.  * Read file header. 
  52.  *    Find out sampling rate, 
  53.  *    size and style of samples, 
  54.  *    mono/stereo/quad.
  55.  */
  56. sbdspstartread(ft) 
  57. ft_t ft;
  58. {
  59.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  60.     int off = 0;
  61.  
  62.     /* If you need to seek around the input file. */
  63.     if (0 && ! ft->seekable)
  64.         fail("SKEL input file must be a file, not a pipe");
  65.  
  66.     if (!ft->info.rate)
  67.         ft->info.rate = 11000;
  68.     ft->info.size = BYTE;
  69.     ft->info.style = UNSIGNED;
  70.     ft->info.channels = 1;
  71. #ifdef LINUXSOUND
  72.     ioctl(fileno(ft->fp), SNDCTL_DSP_RESET, 0);
  73. #else
  74.     ioctl(fileno(ft->fp), DSP_IOCTL_RESET, 0);
  75. #endif
  76. #ifdef SBLAST
  77.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, &off);
  78.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, &ft->info.rate);
  79. #elif defined(LINUXSOUND)
  80.     ioctl(fileno(ft->fp), SNDCTL_DSP_SPEED, ft->info.rate);
  81. #else
  82.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, 0);
  83.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, ft->info.rate);
  84. #endif
  85.     sigint(0);    /* Prepare to catch SIGINT */
  86. }
  87.  
  88. /*
  89.  * Read up to len samples from file.
  90.  * Convert to signed longs.
  91.  * Place in buf[].
  92.  * Return number of samples read.
  93.  */
  94.  
  95. sbdspread(ft, buf, len) 
  96. ft_t ft;
  97. long *buf, len;
  98. {
  99.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  100.     int        rc;
  101.  
  102.     if (got_int) return (0);
  103.     rc = rawread(ft, buf, len);
  104.     if (rc < 0) return 0;
  105.     return (rc);
  106. }
  107.  
  108. /*
  109.  * Do anything required when you stop reading samples.  
  110.  * Don't close input file! 
  111.  */
  112. sbdspstopread(ft) 
  113. ft_t ft;
  114. {
  115. #ifdef SBLAST
  116.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  117. #endif
  118. }
  119.  
  120. sbdspstartwrite(ft) 
  121. ft_t ft;
  122. {
  123.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  124.     int on = 1;
  125.  
  126.     /* If you have to seek around the output file */
  127.     if (0 && ! ft->seekable)
  128.         fail("Output .sbdsp file must be a file, not a pipe");
  129.  
  130.     if (!ft->info.rate)
  131.         ft->info.rate = 11000;
  132.     ft->info.size = BYTE;
  133.     ft->info.style = UNSIGNED;
  134.     ft->info.channels = 1;
  135. #ifdef LINUXSOUND
  136.     ioctl(fileno(ft->fp), SNDCTL_DSP_RESET, 0);
  137. #else
  138.     ioctl(fileno(ft->fp), DSP_IOCTL_RESET, 0);
  139. #endif
  140. #ifdef SBLAST
  141.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  142.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, &on);
  143.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, &ft->info.rate);
  144. #elif defined(LINUXSOUND)
  145.     ioctl(fileno(ft->fp), SNDCTL_DSP_SYNC, 0);
  146.     ioctl(fileno(ft->fp), SNDCTL_DSP_SPEED, ft->info.rate);
  147. #else
  148.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, 1);
  149.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, ft->info.rate);
  150. #endif
  151. }
  152.  
  153. sbdspwrite(ft, buf, len) 
  154. ft_t ft;
  155. long *buf, len;
  156. {
  157.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  158.  
  159.     if (len == 0) return 0;
  160.     return (rawwrite(ft, buf, len));
  161. }
  162.  
  163. sbdspstopwrite(ft) 
  164. ft_t ft;
  165. {
  166.     /* All samples are already written out. */
  167.     /* If file header needs fixing up, for example it needs the */
  168.      /* the number of samples in a field, seek back and write them here. */
  169.     fflush(ft->fp);
  170. #ifdef LINUXSOUND
  171.     ioctl(fileno(ft->fp), SNDCTL_DSP_SYNC, 0);
  172. #else
  173.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  174. #endif
  175. }
  176. #endif
  177.